﻿using Microsoft.Win32;
using System;

namespace Clipboard.Tools
{
    public class RegistryHelper
    {
        private string _keyPath;  // 注册表路径
        private RegistryKey _baseKey;  // 注册表根键（可以是 HKEY_CURRENT_USER 或 HKEY_LOCAL_MACHINE）

        // 构造函数，指定注册表路径
        // isUserSpecific 默认为 true，表示操作当前用户的注册表；如果为 false，则操作整个计算机的注册表
        public RegistryHelper(string keyPath= "Software\\MyApp", bool isUserSpecific = true)
        {
            _keyPath = keyPath;
            _baseKey = isUserSpecific ? Registry.CurrentUser : Registry.LocalMachine;
        }

        // 获取指定键的值
        // 如果指定的键不存在，则返回默认值
        public object GetValue(string valueName, object defaultValue = null)
        {
            try
            {
                // 打开注册表子项
                using (var regKey = _baseKey.OpenSubKey(_keyPath))
                {
                    if (regKey != null)
                    {
                        // 获取指定键值
                        return regKey.GetValue(valueName, defaultValue);
                    }
                    return defaultValue;  // 如果子项不存在，返回默认值
                }
            }
            catch (Exception ex)
            {
                // 发生错误时打印错误信息并返回默认值
                Console.WriteLine($"Error reading registry: {ex.Message}");
                return defaultValue;
            }
        }

        // 设置指定键的值
        public void SetValue(string valueName, object value)
        {
            try
            {
                // 如果注册表子项不存在，则创建子项
                using (var regKey = _baseKey.CreateSubKey(_keyPath))
                {
                    // 设置指定的键值
                    regKey.SetValue(valueName, value);
                }
            }
            catch (Exception ex)
            {
                // 发生错误时打印错误信息
                Console.WriteLine($"Error writing to registry: {ex.Message}");
            }
        }

        // 删除指定键的值
        public void DeleteValue(string valueName)
        {
            try
            {
                // 打开注册表子项，允许写入
                using (var regKey = _baseKey.OpenSubKey(_keyPath, writable: true))
                {
                    if (regKey != null)
                    {
                        // 删除指定的键值
                        regKey.DeleteValue(valueName, false);
                    }
                }
            }
            catch (Exception ex)
            {
                // 发生错误时打印错误信息
                Console.WriteLine($"Error deleting registry value: {ex.Message}");
            }
        }

        // 判断注册表中是否存在某个键
        public bool KeyExists(string valueName)
        {
            try
            {
                // 打开注册表子项
                using (var regKey = _baseKey.OpenSubKey(_keyPath))
                {
                    // 判断键是否存在
                    return regKey != null && regKey.GetValue(valueName) != null;
                }
            }
            catch (Exception ex)
            {
                // 发生错误时打印错误信息并返回 false
                Console.WriteLine($"Error checking registry key existence: {ex.Message}");
                return false;
            }
        }

        // 判断整个注册表键是否存在
        public bool KeyExists()
        {
            try
            {
                // 打开注册表子项
                using (var regKey = _baseKey.OpenSubKey(_keyPath))
                {
                    // 判断注册表子项是否存在
                    return regKey != null;
                }
            }
            catch (Exception ex)
            {
                // 发生错误时打印错误信息并返回 false
                Console.WriteLine($"Error checking registry key existence: {ex.Message}");
                return false;
            }
        }

        // 删除整个注册表键（此操作会删除该键下所有的子项和值）
        public void DeleteKey()
        {
            try
            {
                // 打开注册表子项，允许写入
                using (var regKey = _baseKey.OpenSubKey(_keyPath, writable: true))
                {
                    if (regKey != null)
                    {
                        // 删除整个注册表键（包括所有子项和值）
                        _baseKey.DeleteSubKey(_keyPath);
                    }
                }
            }
            catch (Exception ex)
            {
                // 发生错误时打印错误信息
                Console.WriteLine($"Error deleting registry key: {ex.Message}");
            }
        }
    }
}
